#姓名：伍弘毅
#日期：2019年9月29日
#版本：V1.0
#功能：使用字典


##访问字典中的值
#要获取与键相关联的值，可依次指定字典名和放在方括号内的键

#example1
alien_0 = {'color':'green'}
print(alien_0["color"])
#这将返回字典alien_0中与键'color'相关联的值
#注意：字符串在引用或定义时用双引号或单引号都可以，只要不使语句产生配对错误

#字典中可包含任意数量的键值对
#example2
alien_0 = {"color": 'green', 'points': 5}

new_points = alien_0['points']
print("You just earned " + str(new_points) + " points!")
#上述代码首先定义了一个字典，然后从这个字典中获取与键'points'相关联的值
#并将这个值存储在变量new_points中。接下来，将这个整数转换为字符串
#并打印一条消息，指出玩家获得了多少个点
#如果你在有外星人被射杀时都运行这段代码，就会获取该外星人的点数


##添加键值对
#字典是一种动态结构，可随时在其中添加键—值对
#要添加键—值对，可依次指定字典名、用方括号括起的键和相关联的值
#下面在字典alien_0中添加两项信息：外星人的x坐标和y坐标
#让我们能够在屏幕的特定位置显示该外星人。我们将这个外星人放在屏幕左边缘
#且离屏幕上边缘25像素的地方。由于屏幕坐标系的原点通常为左上角
#因此要将该外星人放在屏幕左边缘，可将x坐标设置为0
#要将该外星人放在离屏幕顶部25像素的地方，可将y坐标设置为25

#example3
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)

alien_0['x_position'] = 0
alien_0['y_position'] = 25
print(alien_0)
#这个字典的最终版本包含四个键—值对，其中原来的两个指定外星人的颜色和点数
#而新增的两个指定位置,Python3将键—值对的添加顺序按输入先后排
#且关心键和值之间的关联关系


##创建一个空字典
#有时候，在空字典中添加键—值对是为了方便，而有时候必须这样做
#为此，可先使用一对空的花括号定义一个字典，再分行添加各个键—值对

#example4
alien_0 = {}

alien_0['color'] = 'green'
alien_0['points'] = 5

print(alien_0)
#这里首先定义了空字典alien_0，再在其中添加颜色和点数，得到前述示例一直在使用的字典
#使用字典来存储用户提供的数据或在编写能自动生成大量键—值对的代码时
#通常都需要先定义一个空字典


##修改字典中的值
#要修改字典中的值，可依次指定字典名、用方括号括起的键以及与该键相关联的新值
#例如，假设随着游戏的进行，需要将一个外星人从绿色改为黄色

#example5
alien_0 = {"color": 'green'}
print("The alien is " + alien_0['color'] + '.')

alien_0['color'] = 'yellow'
print("The alien is " + alien_0['color'] + ' now.')
#我们首先定义了一个表示外星人alien_0的字典，其中只包含这个外星人的颜色
#接下来，我们将与键'color'相关联的值改为'yellow'
#输出表明，这个外星人确实从绿色变成了黄色

#example6
alien_0 = {'x_position': 0, 'y_position': 25, 'speed': 'medium'}
print("Original x-position:" + str(alien_0['x_position']))

#向右移动外星人
#根据外星人当前速度决定将其移动多远
if alien_0['speed'] == 'slow':
	x_increment = 1
elif alien_0['speed'] == 'medium':
	x_increment = 2
else:
	#这个外星人的速度一定很快
	x_increment = 3
	
#新位置等于老位置加上增量
alien_0['x_position'] = alien_0['x_position'] + x_increment

print("New x-position: " + str(alien_0['x_position']))
#我们首先定义了一个外星人，其中包含初始的x坐标和y坐标，还有速度'medium'
#出于简化考虑，我们省略了颜色和点数，但即便包含这些键-值对
#这个示例的工作原理也不会有任何变化。我们还打印了x_position的初始值
#旨在让用户知道这个外星人向右移动了多远
#其中使用了一个if-elif-else结构来确定外星人应向右移动多远
#并将这个值存储在变量x_increment中。如果外星人的速度为'slow'
#它将向右移动一个单位；如果速度为'medium'，将向右移动两个单位
#如果为'fast'，将向右移动三个单位。确定移动量后，将其与x_position的当前值相加
#再将结果关联到字典中的键x_position
#由于这是一个速度中等的外星人，因此其位置将向右移动两个单位
#这种技术很棒：通过修改外星人字典中的值，可改变外星人的行为
#例如，要将这个速度中等的外星人变成速度很快的外星人，可添加如下代码行

#alien_0['apeed'] = 'fast'
#这样，再次运行这些代码时，其中的if-elif-else结构将把一个更大的值赋给变量x_increment


##删除键值对
#对于字典中不再需要的信息，可使用del语句将相应的键—值对彻底删除
#使用del语句时，必须指定字典名和要删除的键

#从字典alien_0中删除键'points'及其值

#example7
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)

del alien_0['points']		# 注意删除的键值对会永远消失
print(alien_0)


##由类似对象组成的字典
#可以使用字典来存储众多对象的同一种信息
#例如，假设你要调查很多人，询问他们最喜欢的编程语言
#可使用一个字典来存储这种简单调查的结果

#example8
favorite_languages = {
	'jen':'python',
	'sarah':'C',
	'edward':'ruby',
	'phil':'python',
	}
	
print("Sarah's favorite language is " +
favorite_languages['sarah'].title() + '.')
#们将一个较大的字典放在了多行中。其中每个键都是一个被调查者的名字
#而每个值都是被调查者喜欢的语言。确定需要使用多行来定义字典时
#在输入左花括号后按回车键，再在下一行缩进四个空格，指定第一个键—值对
#并在它后面加上一个逗号。此后你再次按回车键时，文本编辑器将自动缩进后续键—值对
#且缩进量与第一个键—值对相同。
#定义好字典后，在最后一个键—值对的下一行添加一个右花括号，并缩进四个空格
#使其与字典中的键对齐。另外一种不错的做法是在最后一个键—值对后面也加上逗号
#为以后在下一行添加键—值对做好准备

#注意：
#对于较长的列表和字典，大多数编辑器都有以类似方式设置其格式的功能
#对于较长的字典，还有其他一些可行的格式设置方式
#因此在你的编辑器或其他源代码中，你可能会看到稍微不同的格式设置方式


# 使用get()来访问值
# 使用放在方括号内的键从字典中获取感兴趣的值时，可能会引发问题：如果指定的键不存在就会出错。
# 如果你要求获取外星人的分数，而这个外星人没有分数，结果将如何呢？如果你要求获取外星人的分数，而这个外星人没有分数，结果将如何呢？

alien_0 = {'color': "green", 'speed': "slow"}
# print(alien_0['points'])		# 注意此时会报错，指出存在键值错误

# 第10章将详细介绍如何处理类似的错误，但就字典而言，可使用方法get() 在指定的键不存在时返回一个默认值，从而避免这样的错误。
# 方法get() 的第一个参数用于指定键，是必不可少的；第二个参数为指定的键不存在时要返回的值，是可选的
alien_0 = {'color': "green", 'speed': "slow"}

point_value = alien_0.get('points', 'No point value assigned.')
print(point_value)
# 如果字典中有键'points' ，将获得与之相关联的值；如果没有，将获得指定的默认值。
# 虽然这里没有键'points' ，但将获得一条清晰的消息，不会引发错误

# 如果指定的键有可能不存在，应考虑使用方法get() ，而不要使用方括号表示法。
# 注意 　调用get() 时，如果没有指定第二个参数且指定的键不存在，Python将返回值None 。
# 这个特殊值表示没有相应的值。None 并非错误，而是一个表示所需值不存在的特殊值，第8章将介绍它的其他用途。
